package com.aynu.sparsearray;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class SparseArray {
	// *******↓↓↓↓↓↓↓↓↓↓↓↓*****
	// 二维数组，第一个数表示行，第二个数表示列

	public static void main(String[] args) throws IOException {

		// 1、创建原始的二维数组 11 * 11
		// 1:表示黑子； 2表示蓝子
		int chessArray[][] = new int[11][11];
		chessArray[1][2] = 1;
		chessArray[2][3] = 2;
		chessArray[3][3] = 2;
		// 输出原始数组
		for (int[] row : chessArray) {
			for (int data : row) {
				System.out.printf("%d\t", data);
			}
			System.out.println();
		}

		// 将二维数组转换为稀疏数组
		// 1、先遍历二维数组得到非零的个数
		int sum = 0;
		for (int i = 0; i < chessArray.length; i++) {
			for (int j = 0; j < chessArray.length; j++) {
				if (chessArray[i][j] != 0) {
					sum++;
				}
			}
		}
		System.out.println("有效数据：" + sum);

		// 2、创建对应的稀疏数组
		int sparseArray[][] = new int[sum + 1][3];
		// 3、给稀疏数组赋值
		sparseArray[0][0] = 11;
		sparseArray[0][1] = 11;
		sparseArray[0][2] = sum;

		// 便利二维数组，将非零的值，赋值给稀疏数组
		int count = 1;
		for (int i = 0; i < chessArray.length; i++) {
			for (int j = 0; j < chessArray.length; j++) {
				if (chessArray[i][j] != 0) {
					sparseArray[count][0] = i;
					sparseArray[count][1] = j;
					sparseArray[count][2] = chessArray[i][j];
					count++;
				}
			}
		}

		// 写入文件
		File file = new File("./data/sparseArray.data");
		FileWriter out = new FileWriter(file);

		// 输出稀疏数组的形式
//		System.out.println("~~~~~~~得到稀疏数组~~~~~~~~");
		System.out.print("开始写入文件");

		int num = 0;
		while (num < 5) {
			try {
				Thread.sleep(200);
				System.out.print("。");
				num++;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println();

		for (int i = 0; i < sparseArray.length; i++) {
			System.out.printf("%d\t%d\t%d\t\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
			String str = "" + sparseArray[i][0] + "," + sparseArray[i][1] + "," + sparseArray[i][2] + "\n";
			out.write(str);
		}
		out.close();

		System.out.print("开始读入文件");

		// 读入文件
		BufferedReader input = new BufferedReader(new FileReader(file));

		// 读取后存储的数组
		int sparseArray2[][] = null;
		// 读取的一行数据
		String readLine;
		// 读取文件的行数
		int low = -1;
		// 每行读取文件
		while ((readLine = input.readLine()) != null) {
			// 以','进行分割
			String[] split = readLine.split(",");
			if (low == -1) {
				sparseArray2 = new int[Integer.parseInt(split[2]) + 1][3];
				low++;
			}
			for (int i = 0; i < 3; i++) {
				sparseArray2[low][i] = Integer.parseInt(split[i]);
			}

			low++;
		}
		input.close();

		num = 0;
		while (num < 5) {
			try {
				Thread.sleep(200);
				System.out.print("。");
				num++;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println();

		// 将稀疏数组恢复成二维数组

		// 1、先读取稀疏数组的第一行，根据第一行的数据，创建原始的二维数组
		int chessArray2[][] = new int[sparseArray2[0][0]][sparseArray2[0][1]];
		// 2、在读取稀疏数组后几行数据，并赋值给原始的二维数组
		for (int i = 1; i < sparseArray2.length; i++) {
			chessArray2[sparseArray2[i][0]][sparseArray2[i][1]] = sparseArray2[i][2];
		}

		System.out.println("恢复后的二维数组");
		for (int i = 0; i < chessArray2.length; i++) {
			for (int j = 0; j < chessArray2.length; j++) {
				System.out.printf("%d\t", chessArray2[i][j]);
			}
			System.out.println();
		}

	}
}
